"""
常用 Python 语法讲解与示例（可直接运行）。

每一节会打印一个标题并展示一个或多个小示例，便于交互式学习。

注释与变量：展示单行注释、变量声明与多行字符串。
基本类型与运算：整数、浮点数及常用算术运算（加/减/乘/除/整除/取余/幂）。
字符串：f-string、常见字符串方法（upper、split）。
列表/元组/字典/集合：展示可变/不可变结构、切片、get、集合去重。
控制流：if/elif/else、for、while。
推导式：列表、集合和字典推导式的用法与示例。
函数与参数：默认参数、*args/**kwargs、lambda、map、filter。
生成器：yield 的简单用法，按需生成数据。
装饰器：一个简单 logger 装饰器示例，示范如何在函数调用前后注入逻辑。
类与对象：类定义、实例化、方法与 repr。
with 与异常处理：自定义上下文管理器示例与 try/except 捕获 ZeroDivisionError。
文件读写：写入并读取示例文件 syntax_example.txt（与脚本同目录）。
类型注解：函数输入/输出注解的示例（演示用途）。
enumerate/zip/reversed：常用迭代工具演示。
"""

from contextlib import contextmanager
from typing import Iterator, List, Dict
import os


def section(title: str):
	print('\n' + '-' * 8 + f' {title} ' + '-' * 8)


def comments_and_vars():
	section('注释与变量')
	# 这是单行注释
	'''
	这是多行字符串，也常用作多行注释
	'''
	x = 10
	y = 3.14
	s = 'hello'
	print('x=', x, 'y=', y, 's=', s)


def basic_types_and_ops():
	section('基本类型与运算')
	a = 7
	b = 2
	print('加:', a + b, '减:', a - b, '乘:', a * b, '除:', a / b)
	print('整除:', a // b, '取余:', a % b, '幂:', a ** b)


def strings_demo():
	section('字符串')
	name = '李雷'
	age = 28
	# f-string（Python 3.6+）
	print(f'{name} 年龄 {age}')
	# 常用方法
	print('upper:', name.upper())
	print('split example:', 'a,b,c'.split(','))


def containers_demo():
	section('列表 / 元组 / 字典 / 集合')
	lst = [1, 2, 3]
	tup = (10, 20)
	d = {'k1': 'v1', 'k2': 'v2'}
	s = {1, 2, 2, 3}
	lst.append(4)
	print('list:', lst, 'slice:', lst[1:3])
	print('tuple:', tup)
	print('dict get:', d.get('k3', '默认'))
	print('set:', s)


def control_flow_demo():
	section('控制流 if / for / while')
	x = 5
	if x < 3:
		print('小于 3')
	elif x == 5:
		print('等于 5')
	else:
		print('其他')

	print('for 循环:')
	for i in range(3):
		print('i=', i)

	print('while 循环:')
	t = 0
	while t < 2:
		print('t=', t)
		t += 1


def comprehensions_demo():
	section('推导式（列表 / 集合 / 字典）')
	nums = list(range(6))
	even_squares = [n * n for n in nums if n % 2 == 0]
	print('even_squares:', even_squares)
	s = {n for n in nums if n % 2 == 1}
	print('odd set:', s)
	dm = {n: n * n for n in range(4)}
	print('dict comp:', dm)


def functions_demo():
	section('函数与参数')

	def add(a, b=1):
		return a + b

	print('add(2):', add(2))
	print('add(2,3):', add(2, 3))

	def var_args(*args, **kwargs):
		print('args:', args)
		print('kwargs:', kwargs)

	var_args(1, 2, name='tom')

	print('lambda 与 map/filter:')
	inc = lambda x: x + 1
	print('map inc over [1,2]:', list(map(inc, [1, 2])))
	print('filter even from [1..6]:', list(filter(lambda x: x % 2 == 0, range(1, 7))))


def generators_and_iterators():
	section('生成器与迭代器')

	def gen(n):
		for i in range(n):
			yield i * i

	g = gen(4)
	print('generator next values:')
	for val in g:
		print(val)


def decorator_demo():
	section('装饰器（简单示例）')

	def logger(fn):
		def wrapper(*args, **kwargs):
			print(f'Calling {fn.__name__} with', args, kwargs)
			return fn(*args, **kwargs)

		return wrapper

	@logger
	def mul(a, b):
		return a * b

	print('mul(3,4)=', mul(3, 4))


def class_demo():
	section('类与对象')

	class Animal:
		def __init__(self, name: str):
			self.name = name

		def speak(self):
			return f'{self.name} ?'

		def __repr__(self):
			return f'Animal({self.name!r})'

	a = Animal('猫')
	print('实例:', a, 'speak:', a.speak())


@contextmanager
def simple_ctx(name: str):
	print(f'Entering {name}')
	try:
		yield
	finally:
		print(f'Exiting {name}')


def with_and_exceptions_demo():
	section('with 上下文管理与异常处理')
	# 自定义上下文管理器
	with simple_ctx('示例上下文'):
		print('在上下文内部')

	# 异常处理
	try:
		1 / 0
	except ZeroDivisionError as e:
		print('捕获异常:', e)


def file_io_demo():
	section('文件读写')
	fn = os.path.join(os.path.dirname(__file__), 'syntax_example.txt')
	with open(fn, 'w', encoding='utf-8') as f:
		f.write('第一行\n第二行')
	with open(fn, 'r', encoding='utf-8') as f:
		print('文件内容:\n', f.read())


def typing_demo():
	section('类型注解（演示）')
	def greet(name: str) -> str:
		return 'Hello ' + name

	print(greet('张三'))


def iteration_tools():
	section('enumerate / zip / reversed')
	items = ['a', 'b', 'c']
	for idx, val in enumerate(items, start=1):
		print(idx, val)
	for x, y in zip([1, 2], ['x', 'y']):
		print(x, y)
	print('reversed:', list(reversed(items)))


def main():
	comments_and_vars()
	basic_types_and_ops()
	strings_demo()
	containers_demo()
	control_flow_demo()
	comprehensions_demo()
	functions_demo()
	generators_and_iterators()
	decorator_demo()
	class_demo()
	with_and_exceptions_demo()
	file_io_demo()
	typing_demo()
	iteration_tools()


if __name__ == '__main__':
	main()

